<?php
if (!defined('IN_HZHIU')) {
    exit('the  error');
}

/**
 * 过滤
 *
 * @param string||array $string
 * @return string
 */
function stript_sql($string)
{

    $search_arr = array("/union/i", "/select/i", "/ update /i", "/ outfile /i", "/ or /i", "/ insert /i", "/ delete /i");
    
    $replace_arr = array('', '', '', '', '', '', '');
    return is_array($string) ? array_map('stript_sql', $string) : preg_replace($search_arr, $replace_arr, $string);
}

/**
 * 过滤
 *
 * @param STRING||ARRAY $string
 * @return STRING
 */
function str_addslashes($string)
{

    if (!is_array($string)) {
        return addslashes($string);
    } else {
        foreach ($string as $k => $v) {
            $string[$k] = str_addslashes($v);
        }
    }
    return $string;
}

/**
 * 重定向，$url为空，返回上一级;
 *
 * @param string $url 地址
 * @param int $time  重定向时间
 * @param bool $js   指定用JS重定向
 */
function gourl($url = '', $time = 0, $js = false)
{

    $url = empty($url) ? $_SERVER['HTTP_REFERER'] : $url;
    
    if (!$js) {
        if (headers_sent() || $time > 0) {
            echo '
		<html>      
        <head>      
        <meta http-equiv="refresh" content="{$time};URL={$url}" />      
        </head>      
        </html>';
            exit();
        } else {
            header("Location: {$url}");
            exit();
        }
    }
    $jshtml = '<script language="JavaScript" type="text/javascript">';
    $url = rawurlencode($url);
    if ($time > 0) {
        $jshtml .= "window.setTimeOut(function () { document.location='{$url}'; }, {$time});";
    } else {
        $jshtml .= "document.location='{$url}';";
    }
    echo $jshtml;
    exit();
}

/**
 * 
 * 读取ini配置文件
 * @param string $filename
 */
function getparseini($filename)
{

    $filename = ROOT . DS . 'config' . DS . $filename;
    if (file_exists($filename)) {return parse_ini_file($filename, true);}
    return false;
}

/**
 * 
 * 获取uri参数
 * @param string $inPath
 */
function getUrlParams($inPath)
{

    $newary = array();
    for($i = 3; $i < count($inPath); $i++) {
        //如果不遵守变量规则，直接跳过
        if (preg_match("/[^A-Za-z0-9_]/", $inPath[$i]))
            continue;
        if ($i % 2) {
            $newary[$inPath[$i]] = $inPath[$i + 1];
        }
    }
    //unset($newary[Config::URL_SUFFIX]);
    return $newary;
}

/**
 * 字符串加密以及解密函数
 *
 * @param string $string 原文或者密文
 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 * @param string $key 密钥
 * @param int $expiry 密文有效期, 加密时候有效， 单位 秒，0 为永久有效
 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
 *
 * @example
 *
 * $a = authcode('abc', 'ENCODE', 'key');
 * $b = authcode($a, 'DECODE', 'key');  // $b(abc)
 *
 * $a = authcode('abc', 'ENCODE', 'key', 3600);
 * $b = authcode('abc', 'DECODE', 'key'); // 在一个小时内，$b(abc)，否则 $b 为空
 */
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {
	$ckey_length = 4; // 随机密钥长度 取值 0-32;
	// 加入随机密钥，可以令密文无任何规律，即便是原文和密钥完全相同，加密结果也会每次不同，增大破解难度。
	// 取值越大，密文变动规律越大，密文变化 = 16 的 $ckey_length 次方
	// 当此值为 0 时，则不产生随机密钥
	

	$key = md5 ( $key ? $key : 'default_key' );
	$keya = md5 ( substr ( $key, 0, 16 ) );
	$keyb = md5 ( substr ( $key, 16, 16 ) );
	$keyc = $ckey_length ? ($operation == 'DECODE' ? substr ( $string, 0, $ckey_length ) : substr ( md5 ( microtime () ), - $ckey_length )) : '';
	
	$cryptkey = $keya . md5 ( $keya . $keyc );
	$key_length = strlen ( $cryptkey );
	
	$string = $operation == 'DECODE' ? base64_decode ( substr ( $string, $ckey_length ) ) : sprintf ( '%010d', $expiry ? $expiry + time () : 0 ) . substr ( md5 ( $string . $keyb ), 0, 16 ) . $string;
	$string_length = strlen ( $string );
	
	$result = '';
	$box = range ( 0, 255 );
	
	$rndkey = array ();
	for($i = 0; $i <= 255; $i ++) {
		$rndkey [$i] = ord ( $cryptkey [$i % $key_length] );
	}
	
	for($j = $i = 0; $i < 256; $i ++) {
		$j = ($j + $box [$i] + $rndkey [$i]) % 256;
		$tmp = $box [$i];
		$box [$i] = $box [$j];
		$box [$j] = $tmp;
	}
	
	for($a = $j = $i = 0; $i < $string_length; $i ++) {
		$a = ($a + 1) % 256;
		$j = ($j + $box [$a]) % 256;
		$tmp = $box [$a];
		$box [$a] = $box [$j];
		$box [$j] = $tmp;
		$result .= chr ( ord ( $string [$i] ) ^ ($box [($box [$a] + $box [$j]) % 256]) );
	}
	
	if ($operation == 'DECODE') {
		if ((substr ( $result, 0, 10 ) == 0 || substr ( $result, 0, 10 ) - time () > 0) && substr ( $result, 10, 16 ) == substr ( md5 ( substr ( $result, 26 ) . $keyb ), 0, 16 )) {
			return substr ( $result, 26 );
		} else {
			return '';
		}
	} else {
		return $keyc . str_replace ( '=', '', base64_encode ( $result ) );
	}

}

//其原理是开启输出缓存，页面内容全部输出到缓存，经压缩后再输出
function ob_gzip($content) {
	if (! headers_sent () && extension_loaded ( "zlib" ) && strstr ( $_SERVER ["HTTP_ACCEPT_ENCODING"], "gzip" )) {
		$content = gzencode ( $content, 9 ); // 9 是最大压缩级别，0是最小不压缩
		

		header ( "Content-Encoding: gzip" );
		header ( "Vary: Accept-Encoding" );
		header ( "Content-Length: " . strlen ( $content ) );
	}
	return $content;
}

/**
 * 
 * 截取中文字符
 * @param string $sourcestr
 * @param int $cutlength
 */
function cut_str($sourcestr,$cutlength)
{
   $returnstr='';
   $i=0;
   $n=0;
   $str_length=strlen($sourcestr);//字符串的字节数
   while (($n<$cutlength) and ($i<=$str_length))
    {
      $temp_str=substr($sourcestr,$i,1);
      $ascnum=Ord($temp_str);//得到字符串中第$i位字符的ascii码
      if ($ascnum>=224)    //如果ASCII位高与224，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,3); //根据UTF-8编码规范，将3个连续的字符计为单个字符         
         $i=$i+3;            //实际Byte计为3
         $n++;            //字串长度计1
      }
       elseif ($ascnum>=192) //如果ASCII位高与192，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,2); //根据UTF-8编码规范，将2个连续的字符计为单个字符
         $i=$i+2;            //实际Byte计为2
         $n++;            //字串长度计1
      }
       elseif ($ascnum>=65 && $ascnum<=90) //如果是大写字母，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,1);
         $i=$i+1;            //实际的Byte数仍计1个
         $n++;            //但考虑整体美观，大写字母计成一个高位字符
      }
       else                //其他情况下，包括小写字母和半角标点符号，
      {
         $returnstr=$returnstr.substr($sourcestr,$i,1);
         $i=$i+1;            //实际的Byte数计1个
         $n=$n+0.5;        //小写字母和半角标点等与半个高位字符宽...
      }
    }
          if ($str_length>$cutlength){
          $returnstr = $returnstr . "...";//超过长度时在尾处加上省略号
      }
     return $returnstr;

}

/**
 * 
 * 主调试函数
 * @example debug($a,$b)
 */
function debug()
{

    header('Content-Type:text/html;charset=utf-8');
    $argesAry = func_get_args();
    array_walk($argesAry, "exits");
    $debugs = debug_backtrace();
    echo '<b>';
    krsort($debugs);
    foreach ($debugs as $k => $v) {
        if (isset($v['file']) && isset($v['line'])) {
            echo '<p>';
            echo ($k + 1) . ': File：' . $v['file'] . '  Line：' . $v['line'];
            echo '</p>';
        }
    }
    echo '</b>';
    if (defined("MICROTIME")) {
        $start = getmicrotime(MICROTIME);
        $end = getmicrotime(microtime());
        $times = $end - $start;
        echo "<p align='center'>Runing $times<p>";
    }
    exit();
}

function exits($val, $key)
{

    print_r_string($val);
}

/**
 * 
 * 打印变量
 * @param All $arr 变量
 * @param bool $first 是否整齐输出
 */
function print_r_string($arr, $first = true)
{

    if ($first)
        echo "<pre>\n";
    switch (gettype($arr)) {
        case "array" :
        case "object" :
            print_r($arr);
            break;
        case "boolean" :
        case "integer" :
        case "double" :
        case "string" :
        case 'NULL' :
            debug_zval_dump($arr);
            break;
        default :
            echo 'unknow';
            break;
    }
    if ($first)
        echo "</pre>\n";
}

/**
 * 
 * 得到微秒时间
 * @param String $microtime 时间
 */
function getmicrotime($microtime)
{

    $usec = $sec = '';
    list($usec, $sec) = explode(" ", $microtime);
    return (( float )$usec + ( float )$sec);
}

/**
 * 
 * register_shutdown_function('my_shutdown');
 */
function shutdown_function()
{

    $xhprof_enable = defined('XHPROF_ENABLE') ? XHPROF_ENABLE : false;
    if (!$xhprof_enable)
        return false;
    if (!getConfig('xhprof'))
        return false;
    $xhprof_data = xhprof_disable();
    include_once HZHIHU_ROOT . "helpers/xhprof/xhprof_lib/utils/xhprof_lib.php";
    include_once HZHIHU_ROOT . "helpers/xhprof/xhprof_lib/utils/xhprof_runs.php";
    $xhprof_runs = new XHProfRuns_Default();
    $run_id = $xhprof_runs->save_run($xhprof_data, "default");
    echo '<div><a href="' . HZHIHU_URL . 'xhprof/xhprof_html/index.php?run=' . $run_id . '&source=default" target="_blank">统计</a></div>';
}

register_shutdown_function('shutdown_function');

?>